
package ihm.controller;

import entite.Question;
import entite.QuestionnaireQuestion;
import entite.RenduEnum;
import entite.Reponse;
import entite.TypeReponseEnum;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import metier.GestionQuestionLocal;
import metier.GestionQuestionnaireQuestionLocal;
import metier.GestionReponseLocal;
import org.icefaces.component.fileentry.FileEntry;
import org.icefaces.component.fileentry.FileEntryEvent;
import org.icefaces.component.fileentry.FileEntryResults;


@ManagedBean
@ViewScoped
public class QuestionController implements Serializable {

    private List<RenduEnum> listTypeRendu;
    private String strQuestion = "Question";
    private TypeReponseEnum typeReponse;
    private List<TypeReponseEnum> listTypeReponse;
    private Question question;
    @EJB
    private GestionReponseLocal reponseFacade;
    @EJB
    private GestionQuestionLocal gestionQuestion;
    private boolean rendered;
    private Reponse reponse;
    private FileEntryResults listFichierImage;
    @ManagedProperty(value = "#{questionnaireController}")
    private QuestionnaireController questionnaireController;
    @EJB
    private GestionQuestionnaireQuestionLocal gestionQuestionnaireQuestion;

    
    /**
     * Getter ListTypeRendu
     * @return Liste des typeRendus
     */
    public List getListTypeRendu() {
        return listTypeRendu;
    }

    /**
     * Setter ListTypeRendu
     * @param listTypeRendu
     */
    public void setListTypeRendu(List listTypeRendu) {
        this.listTypeRendu = listTypeRendu;
    }

    /**
     * Getter StrQuestion
     * @return String : strQuestion
     */
    public String getStrQuestion() {
        return strQuestion;
    }

    /**
     * Setter StrQuestion
     * @param question
     */
    public void setStrQuestion(String question) {
        this.strQuestion = question;
    }

    /**
     * Getter TypeReponse
     * @return TypeReponse
     */
    public TypeReponseEnum getTypeReponse() {
        return typeReponse;
    }

    /**
     * Setter TypeReponse
     * @param typeReponse
     */
    public void setTypeReponse(TypeReponseEnum typeReponse) {
        this.typeReponse = typeReponse;
    }

    /**
     * Getter ListTypeReponse
     * @return ListTypeReponseEnum>
     */
    public List<TypeReponseEnum> getListTypeReponse() {
        return listTypeReponse;
    }

    /**
     * Setter ListTypeReponse
     * @param listTypeReponse
     */
    public void setListTypeReponse(List<TypeReponseEnum> listTypeReponse) {
        this.listTypeReponse = listTypeReponse;
    }

    /**
     * Getter Rendered
     * @return boolean : true pour afficher
     *                   false pour ne pas afficher
     */
    public boolean isRendered() {
        return rendered;
    }

    /**
     * Setter Rendered
     * @param rendered
     */
    public void setRendered(boolean rendered) {
        this.rendered = rendered;
    }

    /**
     * Getter Question
     * @return Question
     */
    public Question getQuestion() {
        return question;
    }

    /**
     * Setter Question
     * @param question
     */
    public void setQuestion(Question question) {
        this.question = question;
    }

    /**
     * GEtter Reponse
     * @return Reponse
     */
    public Reponse getReponse() {
        return reponse;
    }

    /**
     * Setter Reponse
     * @param reponse
     */
    public void setReponse(Reponse reponse) {
        this.reponse = reponse;
    }

    /**
     * Getter ListFichierImage
     * @return FileEntryResults
     */
    public FileEntryResults getListFichierImage() {
        return listFichierImage;
    }

    /**
     * Setter ListFichierImage
     * @param FileEntryResults listFichierImage
     */
    public void setListFichierImage(FileEntryResults listFichierImage) {
        this.listFichierImage = listFichierImage;
    }

    /**
     * Setter QuestionnaireControler
     * @param questionnaireController
     */
    public void setQuestionnaireController(QuestionnaireController questionnaireController) {
        this.questionnaireController = questionnaireController;
    }    

    /** 
     * Constructeur
     */
    public QuestionController() {
    }

    /**
     * Méthode d'initialisation
     */
    @PostConstruct
    public void init() {
        setTypeReponse(TypeReponseEnum.PHRASE);
        setListTypeReponse(Arrays.asList(TypeReponseEnum.values()));
        setListTypeRendu(Arrays.asList(RenduEnum.values()));
        setQuestion(new Question());
        getQuestion().setTypeRendu(RenduEnum.TEXTAREA);
        setRendered(false);
    }

    /**
     * Méthode d'enregistrement d'une question
     */
    public void enregistrerQuestion() {
        gestionQuestion.enregistrerNouveauQuestion(getQuestion());        
        
        //permet de lier la question au questionnaire
        QuestionnaireQuestion questionnaireQuestion;
        questionnaireQuestion = gestionQuestionnaireQuestion.enregistrerQuestionnaireQuestion(questionnaireController.getQuestionnaire().getQuestionnaireQuestionCollection().size(), questionnaireController.getQuestionnaire(), getQuestion());
        questionnaireController.enregistrerQuestionnaire();

        questionnaireController.getQuestionnaire().getQuestionnaireQuestionCollection().add(questionnaireQuestion);
        setRendered(true);
        question.getReponseCollection().add(ajouterReponse(1));
        //Util.addInfoMessage(null, "QuestionCreer", FacesContext.getCurrentInstance());
    }

    /**
     * Méthode d'enregistrement des QuestionReponse
     */
    public void enregistrerQuestionReponse() {
        //si l'ordre à changer ou si une réponse à un libellle à null
        miseAJourListReponse();
        gestionQuestion.modifierQuestion(getQuestion());
        questionnaireController.enregistrerQuestionnaire();
        //remet les composant à zéro pour rajouter une question
        init();
    }

    /**
     * Méthode d'ajout d'une réponse à une question
     */
    public void ajouterReponse() {
        miseAJourListReponse();
        question.getReponseCollection().add(ajouterReponse(question.getReponseCollection().size() + 1));
    }

    /**
     * méthode de suppression d'une réponse à une question
     */
    public void supprimerReponse() {
        supprimerReponseBase(getReponse());
        getQuestion().getReponseCollection().remove(getReponse());
        //mise à jour de l'ordre après suppression
        miseAJourListReponse();
    }

    /**
     * Méthode d'ajout d'une réponse avec son ordre
     * @param ordre
     * @return reponse
     */
    private Reponse ajouterReponse(int ordre) {
        Reponse rep1 = new Reponse();
        rep1.setOrdre(ordre);
        rep1.setQuestion(question);
        return rep1;
    }

    /**
     * Méthode permettant permettant de supprimer une réponse en base
     * @param rep
     */
    private void supprimerReponseBase(Reponse rep) {
        reponseFacade.supprimerReponse(rep);
    }

    /**
     * Méthode de mise à jour de la liste de réponse
     */
    private void miseAJourListReponse() {
        if ((getQuestion().getTypeRendu() == RenduEnum.LISTBOX) || (getQuestion().getTypeRendu() == RenduEnum.TEXTAREA)) {
            setTypeReponse(TypeReponseEnum.PHRASE);
        }

        //Sauvegarder la liste de reponse car l'ordre à peu changer l'ordre
        //et le type de réponse aussi
        Integer ordre = 1;



        for (Reponse rep : getQuestion().getReponseCollection()) {
            rep.setTypeReponse(getTypeReponse());
            rep.setOrdre(ordre);
            if (rep.getLibelle() == null) {
                rep.setLibelle("Aucune réponse saisie !");
            }
            if (rep.getId() == null) {
                reponseFacade.enregistrerNouveauReponse(rep);
            } else {
                reponseFacade.modifierReponse(rep);
            }
            ordre++;
        }
    }

    /**
     * Méthode de sauvegarde des fichiers
     * @param event
     */
    public void listener(FileEntryEvent event) {
        System.out.println("---debut---");
        FileEntry fileEntry = (FileEntry) event.getSource();
        FileEntryResults results = fileEntry.getResults();
        for (FileEntryResults.FileInfo fileInfo : results.getFiles()) {
            if (fileInfo.isSaved()) {
                System.out.println(fileInfo.getFileName());
            }
        }
        System.out.println("---fin---");
    }

    /**
     * Méthode de sauvegarde d'image
     */
    public void sauvegarderImage() {
        BufferedInputStream bis;
        BufferedOutputStream bos;

        for (FileEntryResults.FileInfo fileInfo : listFichierImage.getFiles()) {
            if (fileInfo.isSaved()) {

                try {
                    bis = new BufferedInputStream(new FileInputStream(fileInfo.getFile()));
                    //System.getProperty("user.dir") = D:\Dev\NoInstall3\glassfishv3\glassfish\domains\domain1 par exemple
                    File f = new File(System.getProperty("user.dir") + "/temp/FeedBackForm/ressources/images/reponses/");
                    f.mkdirs();

                    bos = new BufferedOutputStream(new FileOutputStream(new File(f.getAbsolutePath() + "/" + fileInfo.getFileName())));
                    byte[] buf = new byte[8];

                    while (bis.read(buf) != -1) {
                        bos.write(buf);
                    }

                    //On ferme nos flux de données
                    bis.close();
                    bos.close();

                    //je sauvegarde juste le chemin qui commence sur le serveur et le nom du fichier
                    //le chemin du serveur qui change et toujours récupérer par System.getProperty("user.dir")
                    //cette commande System.getProperty("user.dir") est mise dans l'entite Reponse pour getCheminImage
                    getReponse().setCheminImage("/temp/FeedBackForm/ressources/images/reponses/"+fileInfo.getFileName());
                    //mise à jour de l'ordre après suppression
                    miseAJourListReponse();


                } catch (FileNotFoundException ex) {
                    //Util.addInfoMessage(null, "erreur fichier", FacesContext.getCurrentInstance());
                } catch (IOException ex) {
                    //Util.addInfoMessage(null, "erreur entrée sortie", FacesContext.getCurrentInstance());
                }

            }
        }
    }    
}
